<?php

/** ================================
 *  Intellect Board 3
 *  http://intblite.ru
 *  Crontab -- выполнение определенных действий по расписанию
 *  ================================ */


include 'index.php'; // подключаем index.php, чтобы из него унаследовать Application

class Crontab extends Application {

    function main() {
        $this->init();

        $this->db->lock_tables(DB_prefix.'crontab',true); // блокируем таблицу crontab полностью, чтобы исключить одновременное выполнение заданий двумя запросами

        $curtime=time();
        $sql = 'SELECT id,module,proc,params,period FROM '.DB_prefix.'crontab WHERE nextrun>0 AND nextrun<='.intval($curtime); // выбираем те задания, время которых ненулевое и уже в прошлом
        $jobs = $this->db->select_all($sql);
        for ($i=0,$count=count($jobs);$i<$count;$i++) {
          // TODO: добавить проверку, что до окончания работы скрипта по таймату осталось еще достаточно времени
          if ($this->load_module($jobs[$i]['module'],false)) {
            $class_name=$jobs[$i]['module'];
            $module = new $class_name;
            if (method_exists($module,$jobs[$i]['proc'])) call_user_func(array($module,$jobs[$i]['proc']),$jobs[$i]['params']);
            else $this->log_entry('crontab',2,'modules/'.$jobs[$i]['module'].'.php','Не найдена процедура '.$jobs[$i]['proc']);
          }
          else $this->log_entry('crontab',1,'crontab.php','Не найден модуль '.$jobs[$i]['module']);
          if ($jobs[$i]['period']!=0) $jobs[$i]['nextrun']=$curtime+$jobs[$i]['period']*60; // если задание не одноразовое, задаем новое время выполнения
          else $jobs[$i]['nextrun']=0; // иначе прописываем ноль, чтобы в дальнейшем игнорировать это задание
          $this->db->update(DB_prefix.'crontab',$jobs[$i],'id='.intval($jobs[$i]['id']));
        }

        $this->db->unlock_tables(DB_prefix.'crontab');

        $this->output(false); // выводим данные и закрываем наконец-то буфер

        $this->db->close();
        $this->process_mail(); // отправляем почту в случае необходимости
    }

/** Подключение файла конфигурации **/
    function init_config() { // Для IntB Lite сейчас все настройки хранятся в базе
    }


/** Подлючение библиотеки аутентификации пользователя **/
    function init_user() {
      // TODO: Для Crontab пользователь не требуется, впрочем, возможно, класс-заглушка создаваться все же будет
   }

/** Вывод итогов выполнения скрипта
 *  Для crontab, если он выполняется не из командной строки, а по HTTP-запросу, выдаем статус 302 c редиректом на пустой пиксель. */
    function output($data) {
      $this->status=302;
      $this->location='/template/spacer.gif';
      $this->output_headers(0,false);
    }
}

global $app;
$app = new Crontab;
$app->main();
?>
